/*
 * miscdev.c
 *
 *  Created on: May 19, 2025
 *      Author: Li Jiahui<2199250859@qq.com>
 */
#include "stm32l4xx_hal.h"
#include "miscdev.h"
#include "usart.h"
#include "FREERTOS.h"
/* Timer delay API */
#include "tim.h"
#include "task.h"

/* MAx to 60000 us */
void udelay(uint16_t us)
{
	uint16_t	differ = 60000 - us;

	HAL_TIM_Base_Start(&htim6);

	__HAL_TIM_SET_COUNTER(&htim6, differ); /* 将计算好的初值写入TMIM6计数器寄存器 */

	while(differ < 60000)
	{
		differ = __HAL_TIM_GET_COUNTER(&htim6); /* 读取当前计数器的值 */
	}

	HAL_TIM_Base_Stop(&htim6);
}




/*gcc编译器中的printf函数会调用__io_putchar()函数，实现最终的字符串打印
 * keil编译器中的printf函数会调用fputc（）函数，实现最终的字符串打印
 * 这里定义一个宏PUTCHAR_PROTOTYPE来兼容这两个编译器所需要的函数原型
 */
#ifdef __GNUC__
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif

/*STM32CubeIDE使用的是gcc编译器，他会内建__GUNC__宏定义，所以下面的PUTCHAR_PROTOTYPE将会扩展为：
 * int __io_putchar(int ch)
 * */
PUTCHAR_PROTOTYPE
{
	/* 调用STM32 HAL库的串口发送函数，将printf要打印的这个字符通过串口发送出去 */
	HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);
	return ch;
}

/* Bazzer API */

/* times:蜂鸣器响几次， interval：响、停的时间间隔 */
void beep_start(uint16_t times, uint16_t interval)
{
	while(times--)
	{
		/* start buzzer */
		if(HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_4) != HAL_OK)
		{
			/* start error */
			Error_Handler();
		}

		vTaskDelay(pdMS_TO_TICKS(interval));
		//HAL_Delay(interval);

		/* stop buzzer */
		if(HAL_TIM_PWM_Stop(&htim1, TIM_CHANNEL_4) != HAL_OK)
		{
			Error_Handler();
		}

		//HAL_Delay(interval);
		vTaskDelay(pdMS_TO_TICKS(interval));
	}
}
